/*
*  klass用来实现“类”继承，----------突然发现个问题，在新建对象传递参数时，不能确定是往父构造函数传，还是子构造函数传
* */

var klass = (function() {
    var F = function() {};
    return function(Parent, props) {
        var Child, i;

        // 1、创建新的构造函数，此处注意理解所有构造函数内部的内容都写在了props._construct方法里面了
        Child = function() {
            if(Child.uber && Child.uber.hasOwnProperty("_construct")) {                // 此处的Child.uber就是父构造函数的prototype，它里面存在_construct属性，也就是父构造函数
                Child.uber._construct.apply(this, arguments);                   // 此处注意apply的第二个参数可以为一个arguments类型的对象
            }
            if(Child.prototype.hasOwnProperty("_construct")) {
                Child.prototype._construct.apply(this, arguments);
            }
        };

        // 2、继承，类似代理函数构造模式
        Parent = Parent || Object;     // 此处如果没有传递被继承的类，则直接继承Object
        F.prototype = Parent.Parent;
        Child.prototype = new F();
        Child.uber = Parent.prototype;
        Child.prototype.constructor = Child;

        // 3、添加实现方法
        for(i in props) {
            if(props.hasOwnProperty(i)) {
                Child.prototype[i] = props[i];
            }
        }

        // 4、返回Child
        return Child;
    };

}());